#!/usr/bin/env python3
"""
Streamlit应用启动脚本 - 支持公共访问
使用方法：python start_public.py
"""

import subprocess
import sys
import socket
import os
from pathlib import Path

def get_local_ip():
    """获取本机局域网IP地址"""
    try:
        # 创建一个UDP socket
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # 连接到一个不存在的地址，不会实际发送数据
        s.connect(("8.8.8.8", 80))
        ip = s.getsockname()[0]
        s.close()
        return ip
    except Exception:
        return "无法获取IP"

def check_port(host, port):
    """检查端口是否可用"""
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(1)
        result = s.connect_ex((host, port))
        s.close()
        return result != 0  # 0表示端口被占用
    except Exception:
        return False

def main():
    print("=" * 50)
    print("🌐 Streamlit应用 - 公共访问模式")
    print("=" * 50)
    print()
    
    # 检查是否在正确的目录
    current_dir = Path.cwd()
    web_app_path = current_dir / "web_app.py"
    
    if not web_app_path.exists():
        print("❌ 错误：未找到 web_app.py 文件")
        print(f"📂 当前目录：{current_dir}")
        print("💡 请在包含 web_app.py 的目录中运行此脚本")
        return
    
    # 获取IP地址
    local_ip = get_local_ip()
    print(f"🔍 检测到的IP地址：{local_ip}")
    
    # 检查端口
    port = 8501
    if not check_port("localhost", port):
        print(f"⚠️  端口 {port} 已被占用，尝试使用端口 8502")
        port = 8502
        if not check_port("localhost", port):
            print("❌ 端口 8501 和 8502 都被占用，请手动指定端口")
            return
    
    print(f"✅ 使用端口：{port}")
    print()
    
    # 显示访问地址
    print("📍 访问地址：")
    print(f"   本地访问: http://localhost:{port}")
    print(f"   网络访问: http://{local_ip}:{port}")
    print()
    
    # 显示提示信息
    print("💡 重要提示：")
    print("   1. 确保Windows防火墙允许端口访问")
    print("   2. 确保设备在同一网络中")
    print("   3. 按 Ctrl+C 停止服务")
    print()
    print("=" * 50)
    print()
    
    # 启动Streamlit
    try:
        cmd = [
            sys.executable, "-m", "streamlit", "run", "web_app.py",
            "--server.address", "0.0.0.0",
            "--server.port", str(port),
            "--server.headless", "true"
        ]
        
        print(f"🚀 启动命令：{' '.join(cmd)}")
        print()
        
        subprocess.run(cmd)
        
    except KeyboardInterrupt:
        print("\n👋 应用已停止")
    except Exception as e:
        print(f"❌ 启动失败：{e}")

if __name__ == "__main__":
    main()
